// admin/system/handler/sys_dept_handler.go
package handler

import (
	"go-admin1/admin/system/model"
	"go-admin1/admin/system/service"
	"go-admin1/internal/common/utils"
	"strconv"

	"github.com/gin-gonic/gin"
)

// SysDeptHandler 部门处理器
type SysDeptHandler struct {
	deptService service.SysDeptService
}

// NewSysDeptHandler 创建部门处理器实例
func NewSysDeptHandler(deptService service.SysDeptService) *SysDeptHandler {
	return &SysDeptHandler{
		deptService: deptService,
	}
}

// Create 创建部门
func (h *SysDeptHandler) Create(c *gin.Context) {
	var dept model.SysDept
	if err := c.ShouldBindJSON(&dept); err != nil {
		utils.FailResponse[string](c, "参数解析失败")
		return
	}

	if err := h.deptService.Create(&dept); err != nil {
		utils.FailResponse[string](c, "创建数据失败")
		return
	}
	utils.OkResponseNoDataWithMessage[string](c, "创建部门成功")
}

// GetByID 根据ID获取部门
func (h *SysDeptHandler) GetByID(c *gin.Context) {
	idStr := c.Param("id")
	id, err := strconv.ParseInt(idStr, 10, 64)
	if err != nil {
		utils.FailResponse[string](c, "参数解析失败")
		return
	}

	dept, err := h.deptService.GetByID(id)
	if err != nil {
		utils.FailResponse[string](c, "获取数据失败")

		return
	}
	utils.OkResponse(c, dept)
}

// Update 更新部门
func (h *SysDeptHandler) Update(c *gin.Context) {
	var dept model.SysDept
	if err := c.ShouldBindJSON(&dept); err != nil {
		utils.FailResponse[string](c, "参数解析失败")
		return
	}

	if err := h.deptService.Update(&dept); err != nil {
		utils.FailResponse[string](c, "更新数据失败")
		return
	}
	utils.OkResponseNoDataWithMessage[string](c, "更新部门成功")

}

// Delete 删除部门
func (h *SysDeptHandler) Delete(c *gin.Context) {
	idStr := c.Param("id")
	id, err := strconv.ParseInt(idStr, 10, 64)
	if err != nil {
		utils.FailResponse[string](c, "参数解析失败")
		return
	}

	if err := h.deptService.Delete(id); err != nil {
		utils.FailResponse[string](c, "删除数据失败")
		return
	}
	utils.OkResponseNoDataWithMessage[string](c, "删除部门成功")
}

// List 部门列表
func (h *SysDeptHandler) List(c *gin.Context) {
	page, _ := strconv.Atoi(c.DefaultQuery("page", "1"))
	pageSize, _ := strconv.Atoi(c.DefaultQuery("pageSize", "10"))
	depts, total, err := h.deptService.List(page, pageSize)

	if err != nil {
		utils.FailResponse[string](c, "获取部门数据失败")
		return
	}

	resultData := map[string]interface{}{
		"list":  depts,
		"total": total,
	}
	utils.OkResponse(c, resultData)

}

// ListByParentID 根据父ID获取部门列表
func (h *SysDeptHandler) ListByParentID(c *gin.Context) {
	parentIDStr := c.Query("parentID")
	parentID, err := strconv.ParseInt(parentIDStr, 10, 64)
	if err != nil {
		utils.FailResponse[string](c, "参数解析失败")
		return
	}

	depts, err := h.deptService.ListByParentID(parentID)
	if err != nil {
		utils.FailResponse[string](c, "获取部门列表数据失败")

		return
	}
	utils.OkResponse(c, depts)
}
